Skip to content

fix(api-types): Allow empty domain description - #1237

Merged
gtema merged 2 commits into
mainfrom
claude/spire-integration-phase-1-y6lzk8
Sep 14, 2026
Merged

fix(api-types): Allow empty domain description#1237
gtema merged 2 commits into
mainfrom
claude/spire-integration-phase-1-y6lzk8

Conversation

@gtema

@gtema gtema commented Sep 14, 2026

Copy link
Copy Markdown
Collaborator

description is Option; validator's length(min=1) fired on
Some("") the same as an actual too-short value, rejecting the empty
string devstack sends on its idempotent domain-create/update calls
with a 400. Drop the min bound, keep max=255.

@github-actions

github-actions Bot commented Sep 14, 2026

Copy link
Copy Markdown

🧪 Tempest Identity Compatibility Results (advisory, non-blocking)

rust

Totals
======
Ran: 133 tests in 29.2272 sec.
 - Passed: 66
 - Skipped: 4
 - Expected Fail: 0
 - Unexpected Success: 0
 - Failed: 63
Sum of execute time for each test: 23.9350 sec.
Failed test IDs
===== FAILED TESTS (target=rust) =====
tempest.api.identity.admin.v3.test_credentials.CredentialsTestJSON.test_credentials_create_get_update_delete[id-7cd59bf9-bda4-4c72-9467-d21cab278355,smoke]
tempest.api.identity.admin.v3.test_application_credentials.ApplicationCredentialsV3AdminTest.test_create_application_credential_with_roles[id-3b3dd48f-3388-406a-a9e6-4d078a552d0e]
tempest.api.identity.admin.v3.test_list_projects.ListProjectsTestJSON.test_list_projects_with_enabled[id-0fe7a334-675a-4509-b00e-1c4b95d5dae8]
tempest.api.identity.admin.v3.test_list_projects.ListProjectsTestJSON.test_list_projects_with_parent[id-6edc66f5-2941-4a17-9526-4073311c1fac]
tempest.api.identity.admin.v3.test_default_project_id.TestDefaultProjectId.test_default_project_id[id-d6110661-6a71-49a7-a453-b5e26640ff6d]
tempest.api.identity.admin.v3.test_oauth_consumers.OAUTHConsumersV3Test.test_create_and_show_consumer[id-c8307ea6-a86c-47fd-ae7b-5b3b2caca76d]
tempest.api.identity.admin.v3.test_oauth_consumers.OAUTHConsumersV3Test.test_delete_consumer[id-fdfa1b7f-2a31-4354-b2c7-f6ae20554f93]
tempest.api.identity.admin.v3.test_oauth_consumers.OAUTHConsumersV3Test.test_list_consumers[id-09ca50de-78f2-4ffb-ac71-f2254036b2b8]
tempest.api.identity.admin.v3.test_oauth_consumers.OAUTHConsumersV3Test.test_update_consumer[id-080a9b1a-c009-47c0-9979-5305bf72e3dc]
tempest.api.identity.admin.v3.test_domains.DomainsTestJSON.test_create_domain_without_description[id-2abf8764-309a-4fa9-bc58-201b799817ad]
tempest.api.identity.admin.v3.test_domains.DomainsTestJSON.test_create_update_delete_domain[id-f2f5b44a-82e8-4dad-8084-0661ea3b18cf,smoke]
tempest.api.identity.admin.v3.test_domain_configuration.DomainConfigurationTestJSON.test_create_domain_config_and_show_config_groups_and_options[id-9e3ff13c-f597-4f01-9377-d6c06c2a1477]
tempest.api.identity.admin.v3.test_domain_configuration.DomainConfigurationTestJSON.test_create_update_and_delete_domain_config_groups_and_opts[id-c7510fa2-6661-4170-9c6b-4783a80651e9]
tempest.api.identity.admin.v3.test_domain_configuration.DomainConfigurationTestJSON.test_show_default_group_config_and_options[id-11a02bf0-6f94-4380-b3b0-c8dc18fc0d22]
tempest.api.identity.admin.v3.test_domains.DomainsTestJSON.test_domain_delete_cascades_content[id-d8d318b7-d1b3-4c37-94c5-3c5ba0b121ea]
tempest.api.identity.admin.v3.test_domains.DomainsTestJSON.test_list_domains_filter_by_enabled[id-3fd19840-65c1-43f8-b48c-51bdd066dff9]
tempest.api.identity.admin.v3.test_project_tags.IdentityV3ProjectTagsTest.test_list_update_delete_project_tags[id-7c123aac-999d-416a-a0fb-84b915ab10de]
tempest.api.identity.admin.v3.test_domains_negative.DomainsNegativeTestJSON.test_create_domain_with_name_length_over_64[id-37b1bbf2-d664-4785-9a11-333438586eae,negative]
tempest.api.identity.admin.v3.test_domains_negative.DomainsNegativeTestJSON.test_delete_active_domain[gate,id-1f3fbff5-4e44-400d-9ca1-d953f05f609b,negative]
tempest.api.identity.admin.v3.test_projects_negative.ProjectsNegativeStaticTestJSON.test_create_projects_name_length_over_64[id-502b6ceb-b0c8-4422-bf53-f08fdb21e2f0,negative]
setUpClass (tempest.api.identity.admin.v3.test_endpoint_groups.EndPointGroupsTest)
tempest.api.identity.admin.v3.test_projects.ProjectsTestJSON.test_create_is_domain_project[id-a7eb9416-6f9b-4dbb-b71b-7f73aaef59d5]
tempest.api.identity.admin.v3.test_projects.ProjectsTestJSON.test_project_create_with_parent[id-1854f9c0-70bc-4d11-a08a-1c789d339e3d]
tempest.api.identity.admin.v3.test_projects.ProjectsTestJSON.test_project_get_equals_list[id-d1db68b6-aebe-4fa0-b79d-d724d2e21162]
tempest.api.identity.admin.v3.test_groups.GroupsV3TestJSON.test_group_users_add_list_delete[id-1598521a-2f36-4606-8df9-30772bd51339,smoke]
tempest.api.identity.admin.v3.test_list_projects.ListProjectsStaticTestJSON.test_list_projects[id-1d830662-22ad-427c-8c3e-4ec854b0af44]
tempest.api.identity.admin.v3.test_groups.GroupsV3TestJSON.test_list_user_groups[id-64573281-d26a-4a52-b899-503cb0f4e4ec]
tempest.api.identity.admin.v3.test_tokens.TokensV3TestJSON.test_get_available_domain_scopes[id-ec5ecb05-af64-4c04-ac86-4d9f6f12f185]
tempest.api.identity.admin.v3.test_tokens.TokensV3TestJSON.test_rescope_token[id-565fa210-1da1-4563-999b-f7b5b67cf112]
tempest.api.identity.admin.v3.test_inherits.InheritsV3TestJSON.test_inherit_assign_check_revoke_roles_on_projects_group[id-26021436-d5a4-4256-943c-ded01e0d4b45]
tempest.api.identity.admin.v3.test_inherits.InheritsV3TestJSON.test_inherit_assign_check_revoke_roles_on_projects_user[id-18b70e45-7687-4b72-8277-b8f1a47d7591]
tempest.api.identity.admin.v3.test_inherits.InheritsV3TestJSON.test_inherit_assign_list_check_revoke_roles_on_domains_group[id-c7a8dda2-be50-4fb4-9a9c-e830771078b1]
tempest.api.identity.admin.v3.test_inherits.InheritsV3TestJSON.test_inherit_assign_list_check_revoke_roles_on_domains_user[id-4e6f0366-97c8-423c-b2be-41eae6ac91c8]
tempest.api.identity.admin.v3.test_inherits.InheritsV3TestJSON.test_inherit_assign_list_revoke_user_roles_on_domain[id-3acf666e-5354-42ac-8e17-8b68893bcd36]
tempest.api.identity.admin.v3.test_inherits.InheritsV3TestJSON.test_inherit_assign_list_revoke_user_roles_on_project_tree[id-9f02ccd9-9b57-46b4-8f77-dd5a736f3a06]
tempest.api.identity.admin.v3.test_roles.RolesV3TestJSON.test_assignments_for_domain_roles[id-3859df7e-5b78-4e4d-b10e-214c8953842a]
tempest.api.identity.admin.v3.test_roles.RolesV3TestJSON.test_assignments_for_implied_roles_create_delete[id-c8828027-df48-4021-95df-b65b92c7429e]
tempest.api.identity.admin.v3.test_roles.RolesV3TestJSON.test_grant_list_revoke_role_to_group_on_domain[id-4bf8a70b-e785-413a-ad53-9f91ce02faa7]
tempest.api.identity.admin.v3.test_roles.RolesV3TestJSON.test_grant_list_revoke_role_to_group_on_project[id-cbf11737-1904-4690-9613-97bcbb3df1c4]
tempest.api.identity.admin.v3.test_roles.RolesV3TestJSON.test_grant_list_revoke_role_to_group_on_system[id-c888fe4f-8018-48db-b959-542225c1b4b6]
tempest.api.identity.admin.v3.test_roles.RolesV3TestJSON.test_grant_list_revoke_role_to_user_on_domain[id-6c9a2940-3625-43a3-ac02-5dcec62ef3bd]
tempest.api.identity.admin.v3.test_roles.RolesV3TestJSON.test_implied_domain_roles[id-eb1e1c24-1bc4-4d47-9748-e127a1852c82]
tempest.api.identity.admin.v3.test_roles.RolesV3TestJSON.test_implied_roles_create_check_show_delete[id-c90c316c-d706-4728-bcba-eb1912081b69]
tempest.api.identity.admin.v3.test_roles.RolesV3TestJSON.test_role_create_update_show_list[id-18afc6c0-46cf-4911-824e-9989cc056c3a,smoke]
tempest.api.identity.admin.v3.test_users.UsersV3TestJSON.test_list_user_projects[id-a831e70c-e35b-430b-92ed-81ebbc5437b8]
tempest.api.identity.admin.v3.test_trusts.TrustsV3TestJSON.test_get_trusts_all[id-4773ebd5-ecbf-4255-b8d8-b63e6f72b65d,smoke]
tempest.api.identity.admin.v3.test_list_users.UsersV3TestJSON.test_list_users_with_not_enabled[id-bff8bf2f-9408-4ef5-b63a-753c8c2124eb]
tempest.api.identity.admin.v3.test_trusts.TrustsV3TestJSON.test_get_trusts_query[id-6268b345-87ca-47c0-9ce3-37792b43403a]
tempest.api.identity.v3.test_catalog.IdentityCatalogTest.test_catalog_standardization[id-56b57ced-22b8-4127-9b8a-565dfb0207e2]
tempest.api.identity.admin.v3.test_trusts.TrustsV3TestJSON.test_trust_expire[id-0ed14b66-cefd-4b5c-a964-65759453e292]
tempest.api.identity.v3.test_api_discovery.TestApiDiscovery.test_api_media_types[id-657c1970-4722-4189-8831-7325f3bc4265,smoke]
tempest.api.identity.v3.test_api_discovery.TestApiDiscovery.test_api_version_resources[id-b9232f5e-d9e5-4d97-b96c-28d3db4de1bd,smoke]
tempest.api.identity.v3.test_api_discovery.TestApiDiscovery.test_identity_v3_existence[id-79aec9ae-710f-4c54-a4fc-3aa25b4feac3]
tempest.api.identity.v3.test_api_discovery.TestApiDiscovery.test_list_api_versions[id-721f480f-35b6-46c7-846e-047e6acea0dc,smoke]
tempest.api.identity.admin.v3.test_trusts.TrustsV3TestJSON.test_trust_impersonate[id-5a0a91a4-baef-4a14-baba-59bf4d7fcace]
tempest.api.identity.v3.test_tokens.TokensV3Test.test_validate_token[id-a9512ac3-3909-48a4-b395-11f438e16260]
tempest.api.identity.admin.v3.test_trusts.TrustsV3TestJSON.test_trust_noimpersonate[id-ed2a8779-a7ac-49dc-afd7-30f32f936ed2]
tempest.api.identity.v3.test_projects.IdentityV3ProjectsTest.test_list_projects_returns_only_authorized_projects[id-86128d46-e170-4644-866a-cc487f699e1d]
tempest.api.identity.admin.v3.test_users_negative.UsersNegativeTest.test_create_user_for_non_existent_domain[id-e75f006c-89cc-477b-874d-588e4eab4b17,negative]
tempest.api.identity.v3.test_application_credentials.ApplicationCredentialsV3Test.test_create_application_credential[id-8080c75c-eddc-4786-941a-c2da7039ae61]
tempest.api.identity.v3.test_application_credentials.ApplicationCredentialsV3Test.test_create_application_credential_expires[id-852daf0c-42b5-4239-8466-d193d0543ed3]
tempest.api.identity.v3.test_application_credentials.ApplicationCredentialsV3Test.test_list_application_credentials[id-ff0cd457-6224-46e7-b79e-0ada4964a8a6]
tempest.api.identity.v3.test_application_credentials.ApplicationCredentialsV3Test.test_query_application_credentials[id-9bb5e5cc-5250-493a-8869-8b665f6aa5f6]
===== END FAILED TESTS (target=rust) =====

View full run

@github-actions

github-actions Bot commented Sep 14, 2026

Copy link
Copy Markdown

🦢 Load Test Results

Goose Attack Report

Plan Overview

Action Started Stopped Elapsed Users
Increasing 26-09-14 10:22:05 26-09-14 10:22:28 00:00:23 0 → 45
Maintaining 26-09-14 10:22:28 26-09-14 10:22:58 00:00:30 45
Decreasing 26-09-14 10:22:58 26-09-14 10:22:59 00:00:01 0 ← 45

Request Metrics

Method Name # Requests # Fails Average (ms) Min (ms) Max (ms) RPS Failures/s
DELETE DELETE /v3/auth/tokens 45 0 527.78 28 834 1.50 0.00
DELETE DELETE /v3/projects/:id (teardown) 1 0 79.00 79 79 0.03 0.00
DELETE DELETE /v3/roles/:id (teardown) 1 0 178.00 178 178 0.03 0.00
DELETE DELETE /v3/users/:id (teardown) 2 0 164.50 119 210 0.07 0.00
DELETE DELETE /v4/mappings/rulesets/:mapping_id (teardown) 1 0 134.00 134 134 0.03 0.00
DELETE DELETE /v4/oauth2/:domain_id/clients/:provider_id (teardown) 1 0 134.00 134 134 0.03 0.00
GET 594 0 593.06 369 979 19.80 0.00
GET GET /SCIM/v2/:domain_id/Users (sync reconcile list) 1695 1695 17.36 1 929 56.50 56.50
GET GET /v3/auth/tokens (validate new) 45 0 542.09 82 704 1.50 0.00
GET GET /v3/auth/tokens (validate revoked) 45 0 492.40 13 654 1.50 0.00
GET GET /v3/projects/:id 55 0 557.69 355 768 1.83 0.00
GET GET /v3/projects/:id (catalog) 82 0 568.90 405 791 2.73 0.00
GET GET /v3/role_assignments 42 0 570.24 433 819 1.40 0.00
GET GET /v3/role_assignments?role.id 42 0 559.76 417 730 1.40 0.00
GET GET /v3/role_assignments?scope.domain.id 42 0 529.62 387 664 1.40 0.00
GET GET /v3/role_assignments?user.id 42 0 534.93 388 696 1.40 0.00
GET GET /v3/roles 110 0 554.55 379 794 3.67 0.00
GET GET /v3/roles/:id 55 0 556.73 427 813 1.83 0.00
GET GET /v3/users/:id 105 0 580.47 388 803 3.50 0.00
GET GET /v3/users/:id (catalog) 103 0 580.49 423 805 3.43 0.00
GET GET /v4/api-keys 27 0 544.89 368 734 0.90 0.00
GET GET /v4/api-keys/:client_id 26 0 622.96 457 817 0.87 0.00
GET GET /v4/mappings/rulesets 28 0 550.96 396 702 0.93 0.00
GET GET /v4/mappings/rulesets/:mapping_id 27 0 564.22 442 794 0.90 0.00
GET GET /v4/oauth2/:domain_id/.well-known/openid-configuration 843 0 52.47 10 190 28.10 0.00
GET GET /v4/oauth2/:domain_id/clients 28 0 549.71 416 701 0.93 0.00
GET GET /v4/oauth2/:domain_id/clients/:provider_id 28 0 547.71 396 800 0.93 0.00
GET GET /v4/oauth2/:domain_id/jwks 843 0 54.18 12 217 28.10 0.00
GET GET /v4/scim_realms 18 0 544.22 438 649 0.60 0.00
GET GET /v4/scim_realms/:domain_id/:provider_id 18 0 557.22 467 710 0.60 0.00
POST POST /v3/auth/tokens 43 0 517.51 376 664 1.43 0.00
POST POST /v3/auth/tokens (password, invalid) 32 0 950.97 556 1337 1.07 0.00
POST POST /v3/auth/tokens (password, project-scoped) 56 0 1224.82 674 1776 1.87 0.00
POST POST /v3/auth/tokens (password, unscoped) 55 0 996.60 646 1655 1.83 0.00
POST POST /v3/auth/tokens (rescope to system) 97 0 630.34 396 799 3.23 0.00
POST POST /v3/auth/tokens (rescope, invalid project) 58 0 526.52 370 679 1.93 0.00
POST POST /v3/auth/tokens (system-scoped, bootstrap admin) 50 0 1253.86 826 1916 1.67 0.00
POST POST /v4/api-keys/:client_id/revoke (teardown) 1 0 77.00 77 77 0.03 0.00
PUT PUT /v4/scim_realms/:domain_id/:provider_id 17 0 646.65 507 828 0.57 0.00
Aggregated 5403 1695 255.09 1 1916 180.10 56.50

Response Time Metrics

Method Name 50%ile (ms) 60%ile (ms) 70%ile (ms) 80%ile (ms) 90%ile (ms) 95%ile (ms) 99%ile (ms) 100%ile (ms)
DELETE DELETE /v3/auth/tokens 500 600 600 600 700 700 800 800
DELETE DELETE /v3/projects/:id (teardown) 79 79 79 79 79 79 79 79
DELETE DELETE /v3/roles/:id (teardown) 178 178 178 178 178 178 178 178
DELETE DELETE /v3/users/:id (teardown) 120 120 120 210 210 210 210 210
DELETE DELETE /v4/mappings/rulesets/:mapping_id (teardown) 134 134 134 134 134 134 134 134
DELETE DELETE /v4/oauth2/:domain_id/clients/:provider_id (teardown) 134 134 134 134 134 134 134 134
GET 600 600 600 700 700 700 800 979
GET GET /SCIM/v2/:domain_id/Users (sync reconcile list) 7 8 10 13 17 23 440 900
GET GET /v3/auth/tokens (validate new) 600 600 600 600 700 700 700 700
GET GET /v3/auth/tokens (validate revoked) 500 600 600 600 600 600 654 654
GET GET /v3/projects/:id 600 600 600 600 700 700 700 768
GET GET /v3/projects/:id (catalog) 600 600 600 600 700 700 791 791
GET GET /v3/role_assignments 600 600 600 600 700 700 800 800
GET GET /v3/role_assignments?role.id 500 600 600 600 700 700 700 700
GET GET /v3/role_assignments?scope.domain.id 500 500 600 600 600 664 664 664
GET GET /v3/role_assignments?user.id 500 600 600 600 600 600 696 696
GET GET /v3/roles 500 600 600 600 600 700 794 794
GET GET /v3/roles/:id 600 600 600 600 700 700 700 800
GET GET /v3/users/:id 600 600 600 700 700 700 800 800
GET GET /v3/users/:id (catalog) 600 600 600 700 700 700 800 800
GET GET /v4/api-keys 600 600 600 600 600 700 700 700
GET GET /v4/api-keys/:client_id 600 700 700 700 700 700 800 800
GET GET /v4/mappings/rulesets 600 600 600 600 700 700 700 700
GET GET /v4/mappings/rulesets/:mapping_id 600 600 600 600 700 700 794 794
GET GET /v4/oauth2/:domain_id/.well-known/openid-configuration 46 53 62 72 89 100 130 190
GET GET /v4/oauth2/:domain_id/clients 500 600 600 600 600 700 700 700
GET GET /v4/oauth2/:domain_id/clients/:provider_id 500 600 600 600 600 700 800 800
GET GET /v4/oauth2/:domain_id/jwks 47 55 65 75 93 120 140 217
GET GET /v4/scim_realms 500 500 600 600 600 600 600 600
GET GET /v4/scim_realms/:domain_id/:provider_id 500 500 600 600 600 700 700 700
POST POST /v3/auth/tokens 500 500 600 600 600 600 664 664
POST POST /v3/auth/tokens (password, invalid) 900 1,000 1,000 1,000 1,000 1,000 1,000 1,000
POST POST /v3/auth/tokens (password, project-scoped) 1,000 1,000 1,000 1,000 1,000 1,776 1,776 1,776
POST POST /v3/auth/tokens (password, unscoped) 1,000 1,000 1,000 1,000 1,000 1,000 1,000 1,655
POST POST /v3/auth/tokens (rescope to system) 600 700 700 700 700 799 799 799
POST POST /v3/auth/tokens (rescope, invalid project) 500 500 600 600 600 679 679 679
POST POST /v3/auth/tokens (system-scoped, bootstrap admin) 1,000 1,000 1,000 1,000 1,000 1,916 1,916 1,916
POST POST /v4/api-keys/:client_id/revoke (teardown) 77 77 77 77 77 77 77 77
PUT PUT /v4/scim_realms/:domain_id/:provider_id 700 700 700 700 700 700 800 800
Aggregated 56 98 500 600 700 700 1,000 1,916

Status Code Metrics

Method Name Status Codes
DELETE DELETE /v3/auth/tokens 45 [204]
DELETE DELETE /v3/projects/:id (teardown) 1 [204]
DELETE DELETE /v3/roles/:id (teardown) 1 [204]
DELETE DELETE /v3/users/:id (teardown) 2 [204]
DELETE DELETE /v4/mappings/rulesets/:mapping_id (teardown) 1 [204]
DELETE DELETE /v4/oauth2/:domain_id/clients/:provider_id (teardown) 1 [204]
GET 594 [200]
GET GET /SCIM/v2/:domain_id/Users (sync reconcile list) 31 [401], 1,664 [429]
GET GET /v3/auth/tokens (validate new) 45 [200]
GET GET /v3/auth/tokens (validate revoked) 45 [404]
GET GET /v3/projects/:id 55 [200]
GET GET /v3/projects/:id (catalog) 82 [200]
GET GET /v3/role_assignments 42 [200]
GET GET /v3/role_assignments?role.id 42 [200]
GET GET /v3/role_assignments?scope.domain.id 42 [200]
GET GET /v3/role_assignments?user.id 42 [200]
GET GET /v3/roles 110 [200]
GET GET /v3/roles/:id 55 [200]
GET GET /v3/users/:id 105 [200]
GET GET /v3/users/:id (catalog) 103 [200]
GET GET /v4/api-keys 27 [200]
GET GET /v4/api-keys/:client_id 26 [200]
GET GET /v4/mappings/rulesets 28 [200]
GET GET /v4/mappings/rulesets/:mapping_id 27 [200]
GET GET /v4/oauth2/:domain_id/.well-known/openid-configuration 843 [200]
GET GET /v4/oauth2/:domain_id/clients 28 [200]
GET GET /v4/oauth2/:domain_id/clients/:provider_id 28 [200]
GET GET /v4/oauth2/:domain_id/jwks 843 [200]
GET GET /v4/scim_realms 18 [200]
GET GET /v4/scim_realms/:domain_id/:provider_id 18 [200]
POST POST /v3/auth/tokens 43 [201]
POST POST /v3/auth/tokens (password, invalid) 32 [401]
POST POST /v3/auth/tokens (password, project-scoped) 56 [201]
POST POST /v3/auth/tokens (password, unscoped) 55 [201]
POST POST /v3/auth/tokens (rescope to system) 97 [201]
POST POST /v3/auth/tokens (rescope, invalid project) 58 [401]
POST POST /v3/auth/tokens (system-scoped, bootstrap admin) 50 [201]
POST POST /v4/api-keys/:client_id/revoke (teardown) 1 [200]
PUT PUT /v4/scim_realms/:domain_id/:provider_id 17 [200]
Aggregated 1,664 [429], 45 [404], 121 [401], 301 [201], 51 [204], 3,221 [200]

Transaction Metrics

Transaction # Times Run # Fails Average (ms) Min (ms) Max (ms) RPS Failures/s
ReadHeavy
0.0 1 0 84.00 84 84 0.03 0.00
0.1 104 0 604.29 405 865 3.47 0.00
0.2 106 0 575.14 389 776 3.53 0.00
0.3 107 0 553.21 400 726 3.57 0.00
TokenLifecycle
1.0 0 0 0.00 0 0 0.00 0.00
1.1 45 0 2083.40 574 2494 1.50 0.00
ValidateToken
2.0 0 0 0.00 0 0 0.00 0.00
2.1 92 0 668.04 447 979 3.07 0.00
UserCRUD
3.0 0 0 0.00 0 0 0.00 0.00
3.1 0 0 0.00 0 0 0.00 0.00
3.2 105 0 580.50 388 803 3.50 0.00
3.3 2 0 164.50 119 210 0.07 0.00
ProjectCRUD
4.0 0 0 0.00 0 0 0.00 0.00
4.1 0 0 0.00 0 0 0.00 0.00
4.2 55 0 557.71 355 768 1.83 0.00
4.3 1 0 79.00 79 79 0.03 0.00
RoleCRUD
5.0 0 0 0.00 0 0 0.00 0.00
5.1 0 0 0.00 0 0 0.00 0.00
5.2 55 0 556.75 427 813 1.83 0.00
5.3 1 0 178.00 178 178 0.03 0.00
RoleList
6.0 0 0 0.00 0 0 0.00 0.00
6.1 110 0 554.59 379 794 3.67 0.00
RoleAssignmentList
7.0 0 0 0.00 0 0 0.00 0.00
7.1 42 0 570.29 433 819 1.40 0.00
7.2 42 0 534.93 388 696 1.40 0.00
7.3 42 0 529.62 387 664 1.40 0.00
7.4 42 0 559.81 418 730 1.40 0.00
UserRead
8.0 0 0 0.00 0 0 0.00 0.00
8.1 104 0 604.71 436 849 3.47 0.00
8.2 103 0 580.53 423 805 3.43 0.00
ProjectRead
9.0 0 0 0.00 0 0 0.00 0.00
9.1 81 0 554.90 369 752 2.70 0.00
9.2 82 0 568.94 405 791 2.73 0.00
PasswordAuth
10.0 55 0 996.60 646 1655 1.83 0.00
10.1 56 0 1224.89 674 1777 1.87 0.00
PasswordAuthNegative
11.0 32 0 951.06 556 1337 1.07 0.00
Rescope
12.0 0 0 0.00 0 0 0.00 0.00
12.1 97 0 630.35 396 799 3.23 0.00
RescopeNegative
13.0 0 0 0.00 0 0 0.00 0.00
13.1 58 0 526.62 370 679 1.93 0.00
SystemScopeAuth
14.0 50 0 1253.92 826 1917 1.67 0.00
ApiKeyCRUD
15.0 0 0 0.00 0 0 0.00 0.00
15.1 0 0 0.00 0 0 0.00 0.00
15.2 26 0 622.96 457 817 0.87 0.00
15.3 27 0 544.89 368 734 0.90 0.00
15.4 1 0 77.00 77 77 0.03 0.00
MappingCRUD
16.0 0 0 0.00 0 0 0.00 0.00
16.1 0 0 0.00 0 0 0.00 0.00
16.2 27 0 564.26 442 795 0.90 0.00
16.3 28 0 551.04 396 702 0.93 0.00
16.4 1 0 134.00 134 134 0.03 0.00
OAuth2ClientCRUD
17.0 0 0 0.00 0 0 0.00 0.00
17.1 0 0 0.00 0 0 0.00 0.00
17.2 28 0 547.71 396 800 0.93 0.00
17.3 28 0 549.71 416 701 0.93 0.00
17.4 1 0 134.00 134 134 0.03 0.00
OAuth2Discovery
18.0 843 0 54.19 12 217 28.10 0.00
18.1 843 0 52.50 10 190 28.10 0.00
ScimRealmRead
19.0 0 0 0.00 0 0 0.00 0.00
19.1 18 0 557.22 467 710 0.60 0.00
19.2 18 0 544.39 439 649 0.60 0.00
19.3 17 0 646.65 507 828 0.57 0.00
ScimSync
20.0 0 0 0.00 0 0 0.00 0.00
20.1 0 0 0.00 0 0 0.00 0.00
20.2 0 0 0.00 0 0 0.00 0.00
20.3 1695 0 17.39 1 929 56.50 0.00
20.4 1694 0 0.00 0 0 56.47 0.00
20.5 1694 0 0.00 0 0 56.47 0.00
20.6 1 0 0.00 0 0 0.03 0.00
Aggregated 8660 0 159.15 1 2494 288.67 0.00

Scenario Metrics

Transaction # Users # Times Run Average (ms) Min (ms) Max (ms) Scenarios/s Iterations
ReadHeavy 6 103 1737.03 1372 2025 3.43 17.17
TokenLifecycle 3 42 2163.48 1786 2494 1.40 14.00
ValidateToken 2 90 669.31 447 979 3.00 45.00
UserCRUD 2 103 581.43 388 803 3.43 51.50
ProjectCRUD 1 54 560.48 355 768 1.80 54.00
RoleCRUD 1 54 556.89 427 813 1.80 54.00
RoleList 2 108 554.68 379 794 3.60 54.00
RoleAssignmentList 3 42 2205.52 1858 2485 1.40 14.00
UserRead 4 101 1189.65 946 1461 3.37 25.25
ProjectRead 3 79 1125.24 853 1398 2.63 26.33
PasswordAuth 4 54 2225.57 1599 2737 1.80 13.50
PasswordAuthNegative 1 31 952.97 556 1337 1.03 31.00
Rescope 2 95 631.07 396 799 3.17 47.50
RescopeNegative 1 57 527.47 370 679 1.90 57.00
SystemScopeAuth 2 48 1263.31 826 1917 1.60 24.00
ApiKeyCRUD 1 26 1167.88 914 1407 0.87 26.00
MappingCRUD 1 27 1118.74 972 1347 0.90 27.00
OAuth2ClientCRUD 1 28 1100.25 882 1318 0.93 28.00
OAuth2Discovery 3 841 107.09 29 307 28.03 280.33
ScimRealmRead 1 17 1758.47 1535 2066 0.57 17.00
ScimSync 1 1694 17.23 1 929 56.47 1694.00
Aggregated 45 3694 366.20 1 2737 123.13 2600.58

Error Metrics

Method Name # Error
GET GET /SCIM/v2/:domain_id/Users (sync reconcile list) 49 401 Unauthorized: GET /SCIM/v2/:domain_id/Users (sync reconcile list)
POST POST /SCIM/v2/:domain_id/Users (sync provision) 1 401 Unauthorized: POST /SCIM/v2/:domain_id/Users (sync provision)
POST POST /v3/auth/tokens (password, invalid) 76 401 Unauthorized: POST /v3/auth/tokens (password, invalid)
POST POST /v3/auth/tokens (rescope, invalid project) 148 401 Unauthorized: POST /v3/auth/tokens (rescope, invalid project)
GET GET /v3/auth/tokens (validate revoked) 150 404 Not Found: GET /v3/auth/tokens (validate revoked)
GET GET /SCIM/v2/:domain_id/Users (sync reconcile list) 1768 429 Too Many Requests: GET /SCIM/v2/:domain_id/Users (sync reconcile list)

View full report

@github-actions

github-actions Bot commented Sep 14, 2026

Copy link
Copy Markdown

🐰 Bencher Report

Projectkeystone
Branchclaude/spire-integration-phase-1-y6lzk8
Testbedubuntu-latest
Click to view all benchmark results
BenchmarkLatencyBenchmark Result
nanoseconds (ns)
(Result Δ%)
Upper Boundary
nanoseconds (ns)
(Limit %)
Command_Serde/apply/remove📈 view plot
🚷 view threshold
81,867.00 ns
(-68.19%)Baseline: 257,357.19 ns
1,310,034.80 ns
(6.25%)
Command_Serde/apply/set📈 view plot
🚷 view threshold
87,072.00 ns
(-79.13%)Baseline: 417,224.53 ns
3,208,868.51 ns
(2.71%)
Command_Serde/pack/delete📈 view plot
🚷 view threshold
124.25 ns
(+6.07%)Baseline: 117.14 ns
154.97 ns
(80.18%)
Command_Serde/pack/delete_index📈 view plot
🚷 view threshold
107.47 ns
(+2.76%)Baseline: 104.59 ns
137.47 ns
(78.18%)
Command_Serde/pack/set📈 view plot
🚷 view threshold
212.30 ns
(+11.59%)Baseline: 190.25 ns
246.53 ns
(86.11%)
Command_Serde/pack/set_index📈 view plot
🚷 view threshold
107.66 ns
(+2.96%)Baseline: 104.57 ns
137.85 ns
(78.10%)
Command_Serde/unpack/delete📈 view plot
🚷 view threshold
160.41 ns
(-14.24%)Baseline: 187.04 ns
271.28 ns
(59.13%)
Command_Serde/unpack/delete_index📈 view plot
🚷 view threshold
128.29 ns
(-17.68%)Baseline: 155.85 ns
220.37 ns
(58.22%)
Command_Serde/unpack/set📈 view plot
🚷 view threshold
246.59 ns
(-6.60%)Baseline: 264.00 ns
366.63 ns
(67.26%)
Command_Serde/unpack/set_index📈 view plot
🚷 view threshold
125.68 ns
(-18.05%)Baseline: 153.36 ns
214.85 ns
(58.50%)
Payload_encryption/pack/remove_cmd📈 view plot
🚷 view threshold
112.36 ns
(+0.97%)Baseline: 111.28 ns
150.52 ns
(74.65%)
Payload_encryption/pack/set_cmd📈 view plot
🚷 view threshold
211.85 ns
(+6.53%)Baseline: 198.86 ns
266.69 ns
(79.44%)
Payload_encryption/unpack/remove_cmd📈 view plot
🚷 view threshold
158.93 ns
(-18.88%)Baseline: 195.92 ns
285.19 ns
(55.73%)
Payload_encryption/unpack/set_cmd📈 view plot
🚷 view threshold
246.76 ns
(-9.51%)Baseline: 272.70 ns
381.53 ns
(64.68%)
Raft_1Node_Latency/prefix/1node📈 view plot
🚷 view threshold
7,704,200.00 ns
(+148.30%)Baseline: 3,102,817.80 ns
7,971,686.42 ns
(96.64%)
Raft_1Node_Latency/read/1node📈 view plot
🚷 view threshold
31,523.00 ns
(-15.22%)Baseline: 37,181.88 ns
52,084.69 ns
(60.52%)
Raft_1Node_Latency/remove/1node📈 view plot
🚷 view threshold
254,750.00 ns
(-77.90%)Baseline: 1,152,761.72 ns
11,476,413.61 ns
(2.22%)
Raft_1Node_Latency/write/1node📈 view plot
🚷 view threshold
265,490.00 ns
(-72.35%)Baseline: 960,258.75 ns
7,538,885.09 ns
(3.52%)
build_snapshot/default📈 view plot
🚷 view threshold
93,497.00 ns
(-23.31%)Baseline: 121,907.67 ns
266,981.44 ns
(35.02%)
fernet token/project📈 view plot
🚷 view threshold
1,489.40 ns
(+5.12%)Baseline: 1,416.86 ns
1,820.67 ns
(81.81%)
get_data_keyspace📈 view plot
🚷 view threshold
0.29 ns
(-7.81%)Baseline: 0.31 ns
0.39 ns
(74.24%)
get_db📈 view plot
🚷 view threshold
0.29 ns
(-8.12%)Baseline: 0.31 ns
0.39 ns
(73.97%)
get_fernet_token_timestamp/project📈 view plot
🚷 view threshold
141.47 ns
(+1.42%)Baseline: 139.49 ns
182.00 ns
(77.73%)
get_keyspace📈 view plot
🚷 view threshold
12.10 ns
(+114.67%)Baseline: 5.64 ns
12.39 ns
(97.71%)
🐰 View full continuous benchmarking report in Bencher

Local, throwaway-VM equivalent of the devstack-full CI job so SPIRE
integration / service-auth changes can be iterated on without waiting
on CI. Verified end-to-end in a 40G-disk VM: stack.sh brings up
mysql/rabbit/nova/cinder/glance/neutron-OVN/SPIRE successfully.

cargo build -p uses the Cargo package names (openstack-keystone,
openstack-keystone-cli-manage), not the binary names, and the script
chowns its DEST dir before devstack's own unprivileged git_clone runs
against it.

Signed-off-by: Artem Goncharov <artem.goncharov@gmail.com>
description is Option<String>; validator's length(min=1) fired on
Some("") the same as an actual too-short value, rejecting the empty
string devstack sends on its idempotent domain-create/update calls
with a 400. Drop the min bound, keep max=255.

Signed-off-by: Artem Goncharov <artem.goncharov@gmail.com>
@gtema
gtema force-pushed the claude/spire-integration-phase-1-y6lzk8 branch from 4ea4de4 to 13d1a03 Compare September 14, 2026 09:47
@gtema
gtema added this pull request to the merge queue Sep 14, 2026
Merged via the queue into main with commit 6f7cc1f Sep 14, 2026
36 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant